#include <iostream>
#include <string>
#include "user.pb.h"
#include "mprpcapplication.h"
#include "rpcprovider.h"

// 用户本地服务 提供两个进程内部方法 一个是Login 一个是GetfriendLists 
class Userservice : public fixbug::UserServiceRpc // 使用在rpc服务发布端(rpc 服务提供者)
{
public:
    bool Login(std::string name, std::string pwd)
    {
        std::cout << "doing local service: Login" << std::endl;
        std::cout << "name:" << name << "pwd:"  << pwd << std::endl;
        return true;
    }

    /* 
    重写基类UserServiceRpc的方法 下面的方法就是框架提供的 
    1. caller ==> Login(LoginRequest) => muduo => callee
    2. callee ==> Login(LoginRequest) => 交到下面重写的Login方法中
    */
     
    void Login(::google::protobuf::RpcController* controller,
                       const ::fixbug::LoginRequest* request,
                       ::fixbug::LoginResponse* response,
                       ::google::protobuf::Closure* done)
    {
        // 框架给业务上报参数Loginrequest 应用获取相应数据做本地业务 
        std::string name = request->name();
        std::string pwd = request->pwd(); 
        
        // 做本地业务
        bool login_result = Login(name, pwd);

        // 传回响应数据 
        fixbug::ResultCode* errcode = response->mutable_result();
        errcode->set_errcode(0);
        errcode->set_errmsg("");
        response->set_success(login_result);

        // 执行回调函数 
        done->Run();
    }
        
};

int main(int argc, char** argv)
{
    // 调用框架初始化 
    MprpcApplication::Init(argc, argv);
    
    // provider是一个网络服务对象，把Userservice发布到rpc节点上 
    RpcProvider provider; 
    provider.NotifyService(new Userservice());

    // 启动一个rpc服务节点 
    provider.Run(); 

    return 0;
}